#include <windows.h>
#include <stdio.h>
#include <conio.h>

HANDLE g_inputThread = NULL;  // 全局变量：输入线程句柄
BOOL g_inputReceived = FALSE; // 全局标志：是否收到输入

// 按键检测线程函数
DWORD WINAPI KeyCheckThread(LPVOID lpParam) {
    int timeout = *(int*)lpParam;  // 超时时间（毫秒）
    int checkInterval = 100;       // 检查间隔（毫秒）
    int elapsedTime = 0;

    while (elapsedTime < timeout && !g_inputReceived) {
        // 检测任意按键（包括输入字符）
        int keyPressed = 0;
        for (int vk = 8; vk <= 255; ++vk) { // 检
            //查常见虚拟键码范围
            if (GetAsyncKeyState(vk) & 0x8000) {
                keyPressed = 1;
                break;
            }
        }
        if (keyPressed) {
            // 等待一小段时间，确保输入已被处理
            Sleep(200);
            // 如果用户输入了内容（stdin有数据）
            if (_kbhit()) {
                g_inputReceived = TRUE;
                break;
            }
        }
        Sleep(checkInterval);
        elapsedTime += checkInterval;
    }

    // 超时处理
    if (!g_inputReceived) {
        printf("\n超时未输入，程序将自动退出...\n");
        Sleep(1000);  // 给用户1秒时间查看提示
        ExitProcess(0);
    }
    return 0;
}

int main() {
    int timeout = 10000;  // 超时时间（10秒）
    char input[100] = {0};

    printf("程序开始运行，请在 %d 秒内输入信息：\n", timeout / 1000);

    // 创建按键检测线程
    g_inputThread = CreateThread(NULL, 0, KeyCheckThread, &timeout, 0, NULL);

    // 主线程继续执行 scanf 等待用户输入
    if (scanf("%99[^\n]", input) == 1) {
        g_inputReceived = TRUE;  // 设置标志，表示已收到输入
        printf("你输入的信息是：%s\n", input);
    }

    // 清理资源
    if (g_inputThread) {
        WaitForSingleObject(g_inputThread, 500);  // 等待线程结束（最多0.5秒）
        CloseHandle(g_inputThread);
    }

    return 0;
}